package x.trident.core.util;

import cn.hutool.core.date.DateUtil;
import x.trident.core.constants.BaseConstants;
import x.trident.core.enums.TimeZoneEnum;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 日期工具类
 *
 * @author jason.yan
 * @since 2022/9/23
 */
public class TridentDateUtil {

    /**
     * 根据时区转换日期
     *
     * @param sourceDate 源日期
     * @param sourceZone 源时区，参考TimeZoneEnum
     * @param targetZone 目标时区
     * @param format     日期格式化样式
     * @return 目标Date
     */
    public static Date dateConvertByZone(String sourceDate, TimeZoneEnum sourceZone, TimeZoneEnum targetZone, String format) {
        // 源日期
        LocalDateTime sdt = LocalDateTime.parse(sourceDate, DateTimeFormatter.ofPattern(format));
        ZoneId sourceZoneId = ZoneId.of(sourceZone.getZoneId());
        ZonedDateTime sourceZonedDateTime = sdt.atZone(sourceZoneId);

        // 目标日期
        ZoneId targetZoneId = ZoneId.of(targetZone.getZoneId());
        ZonedDateTime targetDateTime = sourceZonedDateTime.withZoneSameInstant(targetZoneId);

        // 输出
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
        return DateUtil.parse(dtf.format(targetDateTime));
    }

    /**
     * 日期转换UTC
     * 默认使用"yyyy-MM-dd HH:mm:ss"格式日期
     *
     * @param sourceDate 源日期
     * @param sourceZone 源时区，参考TimeZoneEnum
     * @return UTC Date
     */
    public static Date dateToUtc(String sourceDate, TimeZoneEnum sourceZone) {
        return dateConvertByZone(sourceDate, sourceZone, TimeZoneEnum.ETC_GMT, BaseConstants.DATETIME_FORMAT);
    }

    /**
     * UTC转换日期
     * 默认使用"yyyy-MM-dd HH:mm:ss"格式日期
     *
     * @param sourceDate 源日期，UTC日期
     * @param targetZone 目标时区，参考TimeZoneEnum
     * @return 目标 Date
     */
    public static Date utcToDate(String sourceDate, TimeZoneEnum targetZone) {
        return dateConvertByZone(sourceDate, TimeZoneEnum.ETC_GMT, targetZone, BaseConstants.DATETIME_FORMAT);
    }
}
